/***************************************************************************//**
 * @file     csa37f7x_i2c.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-10-23 PM
 * @brief    该文件包含了I2C各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
* @attention
 *	硬件平台: CSA37F70 评估板V1.0 \n
 *	SDK版本：  CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date 	   <th>Version	<th>Author	            <th>Description
 * <tr><td>2020/10/21  <td>1.0.0    <td>Chipsea MCU Group	<td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_I2C_H__
#define __CSA37F7X_I2C_H__

// Include external header file.

#include "csa37f7x.h"
#include "csa37f7x_sdk.h"

#ifdef __cplusplus
extern "C" {
#endif


/** @addtogroup I2C I2C 总线控制器(I2C)
  I2C 为双向串行总线，为设备之间的数据通讯提供了简单有效的方法。 I2C 是多主机总线，包括冲
突检测和仲裁机制以防止在两个或多个主机试图同时控制总线时发生数据冲突。<br>
###特性: 
    - 支持主机和从机模式
    - 主机和从机之间双向数据传输
    - 多主机总线（无中心主机）
    - 多主机同时发送数据仲裁，总线上串行数据不会被损坏
    - 支持 7 位/10 位寻址模式
    - 支持标准模式（速率高达 100KHz）
    - 支持快速模式（速率高达 400KHz）
    - 可编程的时钟适用不同速率控制
    - 支持地址匹配事件从 DeepSleep1/2 唤醒
    - 不支持 SMBUS 的 SMBA 引脚 alert 功能，但支持 SBUS 其他所有功能
    
  @{
*/

/*!<I2C_CTR1 寄存器比特位定义 */    
#define  I2C_CTR1_I2CEN                      ((uint32_t)0x00000001)        /*!< I2C使能   */       
#define  I2C_CTR1_DFCFG                      ((uint32_t)0x00000F00)        /*!< 数字噪声滤波器配置          */
#define  I2C_CTR1_TXDMAREQEN                 ((uint32_t)0x00004000)        /*!< DMA发送请求使能 */
#define  I2C_CTR1_RXDMAREQEN                 ((uint32_t)0x00008000)        /*!< DMA接收请求使能 */
#define  I2C_CTR1_SLVRC                      ((uint32_t)0x00010000)        /*!< Slave字节控制     */
#define  I2C_CTR1_DISSTRETCH                 ((uint32_t)0x00020000)        /*!< 禁止时钟拉伸       */
#define  I2C_CTR1_WKUPEN                     ((uint32_t)0x00040000)        /*!< 从stop模式唤醒使能        */
#define  I2C_CTR1_GCEN                       ((uint32_t)0x00080000)        /*!< 广播呼叫使能       */
#define  I2C_CTR1_SMBHAEN                    ((uint32_t)0x00100000)        /*!< SMBus host地址使能     */
#define  I2C_CTR1_SMBDDAEN                   ((uint32_t)0x00200000)        /*!< SMBus 设备默认地址使能*/
#define  I2C_CTR1_SMBAEN                     ((uint32_t)0x00400000)        /*!< SMBus alter 使能   */
#define  I2C_CTR1_PECMEN                     ((uint32_t)0x00800000)        /*!< PEC模式使能     */                      

/*!<I2C_CTR2 寄存器比特位定义 */  
#define  I2C_CTR2_MTADR                      ((uint32_t)0x000003FF)        /*!< I2C总线主机传输地址配置          */
#define  I2C_CTR2_TDIR                       ((uint32_t)0x00000400)        /*!< 主机模式下传输方向选择*/
#define  I2C_CTR2_ADRFMT                     ((uint32_t)0x00000800)        /*!< 10bit地址模式选择*/
#define  I2C_CTR2_HEAD10AR                   ((uint32_t)0x00001000)        /*!< 10bit头地址配置 */                                                        
#define  I2C_CTR2_STARTGEN                   ((uint32_t)0x00002000)        /*!< Start 产生，只读*/
#define  I2C_CTR2_STOPGEN                    ((uint32_t)0x00004000)        /*!< 主机模式下Stop产生，只读*/
#define  I2C_CTR2_NACKGEN                    ((uint32_t)0x00008000)        /*!< 从机模式下NACK产生，只读*/
#define  I2C_CTR2_BNUM                       ((uint32_t)0x00FF0000)        /*!< 字节数 */
#define  I2C_CTR2_RELOADM                    ((uint32_t)0x01000000)        /*!< NBYTES 重载模式*/
#define  I2C_CTR2_TENDSEL                    ((uint32_t)0x02000000)        /*!< 主机模式下自动结束模式 */
#define  I2C_CTR2_PECCTR                     ((uint32_t)0x04000000)        /*!< Packet error 检验字节*/
                                                                                     
/*!<I2C_SADR1 寄存器比特位定义 */   
#define  I2C_SADR1_SADR1                     ((uint32_t)0x000003FF)        /*!< 从机模式地址1*/
#define  I2C_SADR1_SADR1MODE                 ((uint32_t)0x00000400)        /*!< 从机地址1 10-bit 模式*/
#define  I2C_SADR1_SADR1EN                   ((uint32_t)0x00008000)        /*!< 从机地址1使能*/
                                                                             
/*!<I2C_SADR2 寄存器比特位定义 */   
#define  I2C_SADR2_SADR2                     ((uint32_t)0x000000FE)        /*!<从机地址2模式*/
#define  I2C_SADR2_SADR2MSK                  ((uint32_t)0x00000700)        /*!<从机地址2屏蔽位*/
#define  I2C_SADR2_SADR2EN                   ((uint32_t)0x00008000)        /*!<从机地址2使能 */

/*!<I2C_TMR 寄存器比特位定义 */   
#define  I2C_TMR_SCLLT                       ((uint32_t)0x000000FF)        /*!< 主机模式SCL低周期*/
#define  I2C_TMR_SCLHT                       ((uint32_t)0x0000FF00)        /*!< 主机模式SCL高周期*/
#define  I2C_TMR_SDAHT                       ((uint32_t)0x000F0000)        /*!< SDA数据保持时间*/
#define  I2C_TMR_SDAST                       ((uint32_t)0x00F00000)        /*!< SDA数据建立时间*/
#define  I2C_TMR_TPDIV                       ((uint32_t)0xF0000000)        /*!< 时序预分频 */

/*!<I2C_OVRT 寄存器比特位定义 */ 
#define  I2C_OVRT_TIMA                      ((uint32_t)0x00000FFF)        /*!< 总线超时阈值A*/
#define  I2C_OVRT_IDLEDEN                   ((uint32_t)0x00001000)        /*!< 时钟A空闲超时检测 */
#define  I2C_OVRT_TIMAEN                    ((uint32_t)0x00008000)        /*!< 时钟超时使能*/
#define  I2C_OVRT_TIMB                      ((uint32_t)0x0FFF0000)        /*!< 总线超时阈值B*/
#define  I2C_OVRT_TIMBEN                    ((uint32_t)0x80000000)        /*!< 扩展时钟超时检测使能*/

/** 
  * @brief I2C_STS 寄存器比特位定义
  */
#define  I2C_STS_MSLVA                      ((uint32_t)0x00FE0000)        /*!< 匹配从机地址*/

/** 
  * @brief I2C_PECCODE 寄存器比特位定义
  */
#define  I2C_PECCODE_PECCODE                ((uint32_t)0x000000FF)       /*!< 接收包错误校验码*/

/** 
  * @brief I2C_RXBUF 寄存器比特位定义
  */
#define  I2C_RXBUF_RXBUF                    ((uint32_t)0x000000FF)        /*!< 接收数据寄存器*/

/** 
  * @brief I2C_TXBUF 寄存器比特位定义
  */
#define  I2C_TXBUF_TXBUF                     ((uint32_t)0x000000FF)        /*!< 发送数据寄存器*/


/**
 * @brief      I2C 标志
 */
typedef enum
{
    I2C_STS_TXEF                =      ((uint32_t)0x00000001),       /*!< 发送模式下的数据寄存器空标志    */
    I2C_STS_TXINTF              =      ((uint32_t)0x00000002),       /*!< 传输中断标志                    */
    I2C_STS_RXNEF               =      ((uint32_t)0x00000004),       /*!< 接收数据寄存器不为空            */
    I2C_STS_ADRF                =      ((uint32_t)0x00000008),       /*!< 从机地址匹配标志                */
    I2C_STS_NACKF               =      ((uint32_t)0x00000010),       /*!< NACK 接收标志                   */
    I2C_STS_STOPF               =      ((uint32_t)0x00000020),       /*!< Stop 检测标记                   */
    I2C_STS_CMPF                =      ((uint32_t)0x00000040),       /*!< 主机模式传输完成标志            */
    I2C_STS_RLDF                =      ((uint32_t)0x00000080),       /*!< 传输完成已重载标志              */
    I2C_STS_BUSERRF             =      ((uint32_t)0x00000100),       /*!< 总线错误标志                    */
    I2C_STS_ARBLOF              =      ((uint32_t)0x00000200),       /*!< 仲裁失败标志                    */
    I2C_STS_OVRF                =      ((uint32_t)0x00000400),       /*!< 从机溢出或下溢标志              */
    I2C_STS_PECERRF             =      ((uint32_t)0x00000800),       /*!< 接收PEC错误标志                 */
    I2C_STS_OVRTF               =      ((uint32_t)0x00001000),       /*!< 超时或tLOW检测标志              */
    I2C_STS_SMBAF               =      ((uint32_t)0x00002000),       /*!< SMBus告警标志                   */
    I2C_STS_BUSYF               =      ((uint32_t)0x00008000),       /*!< 总线忙标志                      */
    I2C_STS_DIRF                =      ((uint32_t)0x00010000),       /*!< 从机传输方向标志                */
   
} i2c_flag_t;


/**
 * @brief      I2C模拟滤波器使能或禁用定义
 */
typedef enum
{
    I2C_CTR1_AFDIS   =      ((uint32_t)0x00001000),         /*!< 关闭模拟噪声滤波器*/
    I2C_CTR1_AFEN    =      ((uint32_t)0x00000000),         /*!< 打开模拟噪声滤波器*/

} i2c_anf_off_t;



/**
 * @brief      I2C 总线模式定义
 */
typedef enum
{
    I2C_BUS_MODE_I2C                =  ((uint32_t)0x00000000),          /*!<  I2C模式 */
    I2C_BUS_MODE_SMBUS_DEVICE       =  I2C_CTR1_SMBDDAEN,               /*!< 使能SMBus默认地址使能位 */
    I2C_BUS_MODE_SMBUS_HOST         =  I2C_CTR1_SMBHAEN,                /*!< 使能SMBus主地址使能位 */

} i2c_mode_cfg_t;
 

/**
 * @brief      I2C ACK使能或禁用定义
 */
typedef enum
{
    I2C_ACK_ENABLE         =       ((uint32_t)0x00000000),              /*!< 使能ACK */
    I2C_ACK_DISABLE        =       I2C_CTR2_NACKGEN,                    /*!< 禁用ACK */

} i2c_ack_cfg_t;


/**
 * @brief     I2C地址格式定义
 */
typedef enum
{
    I2C_ACK_ADDR_7BITS         =       ((uint32_t)0x00000000),          /*!< 从机地址 7bits */
    I2C_ACK_ADDR_10BITS        =       I2C_SADR1_SADR1MODE,             /*!< 从机地址 10bits */

} i2c_addr_len_t;

/**
 * @brief      I2C DMA传输请求
 */
typedef enum
{
    I2C_TX_DMA_REQUEST     =     I2C_CTR1_TXDMAREQEN,                   /*!< 使能发送DMA请求 */
    I2C_RX_DMA_REQUEST     =     I2C_CTR1_RXDMAREQEN,                   /*!< 使能接收DMA请求 */   

} i2c_dma_request_t;


/**
 * @brief      I2C传输结束模式定义
 */
typedef enum
{
    I2C_RELOAD_MODE               =       I2C_CTR2_RELOADM,             /*!<  I2C字节重载模式 */
    I2C_TRANFER_END_MODE          =       I2C_CTR2_TENDSEL,             /*!<传输结束模式 */
    I2C_SOFTWARE_END_MODE         =     ((uint32_t)0x00000000),         /*!< 软件结束模式 */

} i2c_tranfer_end_t;


/**
 * @brief      I2C总线配置选择定义
 */
typedef enum
{
    I2C_RELEASE_CONFIG     = ((uint32_t)0x00000000),                    /*!< I2C总线释放式 */
    I2C_STOP_CONFIG        = I2C_CTR2_STOPGEN    ,                      /*!< I2C总线停止控制 */
    I2C_WRITE_CONFIG       = I2C_CTR2_STARTGEN  ,                       /*!< I2C总线写控制     */       
    I2C_READ_CONFIG        = (uint32_t)(I2C_CTR2_STARTGEN | I2C_CTR2_TDIR),  //!<I2C BUS read config
    
} i2c_opera_set_t;

/**
 * @brief      I2C中断配置
 */
typedef enum
{
    I2C_CTR1_TXISIE          =        0x02,                 /*!< 发送中断              */ 
    I2C_CTR1_RXNEIE          =        0x04,                 /*!< 接收中断              */
    I2C_CTR1_ADRMIE          =        0x08,                 /*!< 地址匹配中断          */
    I2C_CTR1_NACKRIE         =        0x10,                 /*!< 接收NACK中断          */
    I2C_CTR1_STOPDIE         =        0x20,                 /*!< STOP检测中断          */
    I2C_CTR1_CMPIE           =        0x40,                 /*!< 传输完成中断          */
    I2C_CTR1_ERRDIE          =        0x80,                 /*!< 错误中断              */
} i2c_interrupt_cfg_t;


/**
 * @brief      I2C中断清除
 */
typedef enum
{
    I2C_STSC_ADRFC                 =    ((uint32_t)0x00000008),        /*!< 从机地址匹配中断清除      */
    I2C_STSC_NACKFC                =    ((uint32_t)0x00000010),        /*!< NACK 接收标志清除*/
    I2C_STSC_STOPFC                =    ((uint32_t)0x00000020),        /*!< Stop 检测标志清除*/
    I2C_STSC_BUSERRFC              =    ((uint32_t)0x00000100),        /*!< 总线错误标志清除*/
    I2C_STSC_ARLOFC                =    ((uint32_t)0x00000200),        /*!< 仲裁丢失标志清除*/
    I2C_STSC_OVRFC                 =    ((uint32_t)0x00000400),        /*!< 从机溢出/欠载标志清除*/
    I2C_STSC_PECERRFC              =    ((uint32_t)0x00000800),        /*!< PEC 错误标志清除*/
    I2C_STSC_OVRTFC                =    ((uint32_t)0x00001000),        /*!< 超时检测标志清除*/
    I2C_STSC_SMBAFC                =    ((uint32_t)0x00002000),        /*!< SMBus 警告标志清除*/
} i2c_flag_clear_t;

/**
 * @brief      I2C数据传输方向
 */
typedef enum
{
    I2C_DIRECTION_TX    =  ((uint16_t)0x0000),                          /*!<设置发送数据传输方向*/
    I2C_DIRECTION_RX    =  ((uint16_t)0x0400),                          /*!<设置接收数据传输方向*/
} i2c_direction_t;


/**
  * @struct i2c_config_t
  * @brief I2C 结构体定义
  */
typedef struct
{
    uint32_t tmr_value;                                                 /*!< 指定I2C_TMR寄存器值     */                                    
    i2c_anf_off_t analog_flag;                                          /*!< 使能或禁用模拟噪声滤波器   */                                   
    uint32_t digital_value;                                             /*!< 设置模拟噪声滤波器范围 0x00 ~ 0x0F     */                                   
    i2c_mode_cfg_t mode;                                                /*!< 设置I2C模式              */                          
    uint32_t slave_addr1;                                               /*!< 设置从地址1长度，7bits或10bits    */                                   
    i2c_ack_cfg_t ack_flag;                                             /*!< 使能或禁用ACK                    */                
    i2c_addr_len_t ack_addr;                                            /*!< 设置ACK地址长度，7bits或10bits   */                        
}i2c_config_t;


/**
  * @ brief I2C数字滤波器值检查
  */
#define I2C_DIGITAL_FILTER_CHECK(filter)   ((filter) <= 0x0000000F)
                             
/** 
  * @ brief I2C 从地址1检查定义
  */
#define I2C_SLAVE_ADDR1_CHECK(addr)   ((addr) <= (uint32_t)0x000003FF) 

/** 
  * @ brief I2C 从地址2检查定义
  */
#define I2C_SLAVE_ADDR2_CHECK(addr)   ((addr) <= (uint16_t)0x00FF) 

/** 
  * @ brief check  I2C从地址2掩码值检查定义
  */
#define I2C_SLAVE_ADDR2_MASK_CHECK(mask)  ((mask) < ((uint8_t)0x08)) 
                                         
/** 
  * @ brief I2C 定时器超时值检查定义
  */
#define I2C_OVERTIME_CHECK(value)   ((value) <= (uint16_t)0x0FFF)

/**@brief		I2C结构体初始化

 *@param[in]    ptr_struct I2C结构体	
 * @return		无
*/
void i2c_struct_init(i2c_config_t* ptr_struct);

/**@brief		I2C控制器复位
 *	
 * @return		无
*/
void i2c_def_init(void);

/**@brief		I2C初始化
 * 
 *@param[in]    ptr_struct I2C结构体	
 * @return		无
*/
void i2c_init(i2c_config_t* ptr_struct);

/**@brief		I2C使能控制
 *	
 * @param[in]   enable_flag 使能控制选择
 *              	1：使能I2C功能
 *              	0：禁用I2C功能
 * @return		无
*/
void i2c_enable_ctrl(enable_state_t enable_flag);

/**@brief		I2C软件复位
 *	
 * @return		无
*/
void i2c_software_reset(void);


/**@brief		I2C中断控制
 *	
 * @param[in]   enable_flag    I2C使能控制
 *              	1   使能I2C
 *              	0   禁用I2C
 * @return		无
*/
void i2c_interrupt_config(i2c_interrupt_cfg_t flag,enable_state_t enable_flag);

/**@brief		I2C禁止时钟拉伸，只在I2C禁用时可配
 *	
 * @param[in]	enable_flag    I2C禁止时钟拉伸控制
 *					1	禁止时钟拉伸
 *					0	使能时钟拉伸
 * @return		无
*/
void i2c_stretch_clock_enable_ctrl(enable_state_t enable_flag);

/**@brief		I2C从STOP模式唤醒使能
 *	
 * @param[in]	enable_flag    I2C从STOP模式唤醒使能控制
 *					1	使能从STOP模式唤醒
 *					0	禁止从STOP模式唤醒
 * @return		无
*/
void i2c_wakeup_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C地址2使能
 *	
 * @param[in]	enable_flag    I2C地址2使能控制
 *					1	使能地址2，收到地址2回ACK
 *					0	禁用地址2，收到地址2回NACK
 * @return		无
*/
void i2c_slave_address2_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C接口地址配置，只在I2C地址2禁用时可配
 *	
 * @param[in]	addr   接口地址
 * @param[in]	mask   地址2屏蔽位
 * @return		无
*/
void i2c_slave_address2_config( uint16_t addr, uint8_t mask);

/**@brief		I2C广播呼叫使能
 *	
 * @param[in]	enable_flag    I2C广播呼叫使能控制
 *					1	使能广播呼叫
 *					0	禁用广播呼叫
 * @return		无
*/
void i2c_call_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C salve字节控制使能
 *	
 * @param[in]	enable_flag    I2C salve字节控制使能控制
 *					1	使能Slave 字节控制
 *					0	禁用Slave 字节控制
 * @return		无
*/
void i2c_slave_response_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C salve地址配置
 *	
 * @param[in]	addr    I2C salve地址
 * @return		无
*/
void i2c_slave_address_config( uint32_t addr);

/**@brief		I2C 10bit地址模式选择
 *	
 * @param[in]	enable_flag		I2C 10bit地址模式选择
 *					1	10bit地址
 *					0	7bit地址
 * @return		无
*/
void i2c_address_format_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 自动结束模式选择
 *	
 * @param[in]	enable_flag 	I2C 自动结束模式选择
 *					1 	自动结束模式。NBYTES数据传输完毕之后自动添加STOP
 *					0	软件结束模式，NBYTES数据传输完毕之后，TC标志置位，SCL拉低
 * @return		无
*/
void i2c_transfer_end_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C NBYTES重载模式选择
 *	
 * @param[in]	enable_flag 	I2C NBYTES重载模式选择
 *					1	NBYTES数据传输完成, 本次传输没有完成(NBYTES会被重载)，TCR置位，拉低SCL
 *					0	NBYTES数据传输完成，本次传输完毕
 * @return		无
*/
void i2c_reload_enable_ctrl( enable_state_t enable_flag);


/**@brief		I2C 字节数配置
 *	
 * @param[in]	counter 	发送或接收的字节数
 * @return		无
*/
void i2c_bytes_number_config( uint8_t counter);

/**@brief		I2C 传输方向选择
 *	
 * @param[in]	direction 传输方向配置
 *					1	master请求读
 *					0	master请求写
 * @return		无
*/
void i2c_request_direction_config( uint16_t direction);

/**@brief		产生I2C START通信使能配置
 *	
 * @param[in]	enable_flag 产生I2C START通信使能配置选择
 *					1	产生START或者RESTART
 *					0	不产生START
 * @return		无
*/
void i2c_start_enable_ctrl( enable_state_t enable_flag);

/**@brief		产生I2C STOP通信使能配置
 *	
 * @param[in]	enable_flag 产生I2C STOP通信使能配置选择
 *					1	当前byte传输完成之后产生STOP
 *					0	没有STOP产生
 * @return		无
*/
void i2c_stop_enable_ctrl(enable_state_t enable_flag);

/**@brief		产生I2C STOP通信使能配置
 *	
 * @param[in]	enable_flag 产生I2C STOP通信使能配置选择
 *					1	当前byte传输完成之后产生STOP
 *					0	没有STOP产生
 * @return		无
*/
void i2c_10bit_address_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C slave模式下产生NACK使能
 *	
 * @param[in]	enable_flag I2C slave模式下产生NAC使能选择
 *					1	接收当前字节之后发送ACK
 *					0	接收当前字节之后发送NACK
 * @return		无
*/  
void i2c_ack_config( enable_state_t enable_flag);
	
/**@brief		I2C slave模式下产生NACK使能
 *	
 * @param[in]	enable_flag I2C slave模式下产生NAC使能选择
 *					1	接收当前字节之后发送ACK
 *					0	接收当前字节之后发送NACK
 * @return		无
*/
uint8_t i2c_match_address_get(void);

/**@brief		I2C 发送方向查询
 *	
 * @return		返回I2C发送方向
 *				I2C_DIRECTION_TX	slave进入发送模式
 *				I2C_DIRECTION_RX	slave进入接收模式
*/
i2c_direction_t i2c_transfer_direction_get(void);

/**@brief		I2C 通信传输配置
 *	
 * @param[in]	addr		传输通信地址
 *				counter		传输发送或接收字节数
 *				end_select	结束模式选择
 *				operate_set	操作模式选择
 * @return		无
*/
void i2c_transfer_handle( uint32_t addr, uint8_t counter, i2c_tranfer_end_t end_select, i2c_opera_set_t operate_set);

/**@brief		I2C SMBus alert使能
 *	
 * @param[in]	 enable_flag I2C SMBus alert使能选择
 * 			 		1  支持SMBus Alert pin
 * 			 		0  不支持SMBus Alert pin
 * @return 	 无
 */
void i2c_smbus_alert_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 时钟超时使能
 *	
 * @param[in]	 enable_flag I2C 时钟超时使能选择
 *			 		1  使能SCL 超时检测
 *			 		0  禁用SCL 超时检测
 * @return	 无
 */
void i2c_overtime_a_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 扩展时钟超时检测使能
 *	
 * @param[in]	 enable_flag I2C 扩展时钟超时检测使能
 *			 		1  使能扩展时钟超时检测
 *			 		0  禁用扩展时钟超时检测
 * @return	 无
 */
void i2c_overtime_b_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 时钟空闲超时检测使能
 *	
 * @param[in]	 enable_flag I2C 时钟空闲超时检测使能选择
 *			 		1  TIMEOUTA用来检测SCL和SDA同时为高超时(总线空闲)
 *			 		0  TIMEOUTA用来检测SCL为低时间超时
 * @return	 无
 */
void i2c_idle_overtime_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 总超时阈值A配置
 *	
 * @param[in]	 value	总超时阈值A设定值
 *			 		TIDLE=0，检测SCL低电平超时, tTIMEOUT= (value+1) x 2048 x tI2CCLK
 *			 		TIDLE=1，检测SCL和SDA同时为高超时, tIDLE= (value+1) x 4 x tI2CCLK
 * @return	 无
 */
void i2c_overtime_a_config( uint16_t value);

/**@brief		I2C 总超时阈值B配置
 *	
 * @param[in]	 value	总超时阈值B设定值
 * 				 	master模式:对应于tLOW:MEXT, slave模式:对应于tLOW:SEXT
 *				 	tLOW:EXT= (value+1) x 2048 x tI2CCLK
 * @return	 无
 */
void i2c_overtime_b_config( uint16_t value);

/**@brief		I2C PEC使能
 *	
 * @param[in]	 enable_flag 	I2C PEC使能选择
 *			 		1   使能PEC计算
 *			 		0   禁用PEC计算
 * @return	 无
 */
void i2c_pec_enable_ctrl( enable_state_t enable_flag);


/**@brief		I2C 包错误检验字节使能
 *	
 * @param[in]	 enable_flag 	I2C 包错误检验字节使能选择
 *					1	发送/接收时需要添加PEC
 *					0	没有PEC
 * @return	 无
 */
void i2c_pec_byte_enable_ctrl( enable_state_t enable_flag);

/**@brief		I2C 包错误检验码获取
 *	
 * @return	 返回包错误校验码，1个字节
 */
uint8_t i2c_pec_code_get(void);

/**@brief		I2C 数据发送
 *	
 * @param[in]	value		I2C 发送的数据
 * @return	 	无
 */ 
void i2c_data_send( uint8_t value);

/**@brief		I2C 数据接收
 *	
 * @return	 	返回I2C接收到的数据
 */ 
uint8_t i2c_data_receive(void);

/**@brief		I2C DMA使能控制
 *	
 * @param[in]	 request		I2C DMA发送或接收模式选择
 *					I2C_CTR1_TXDMAREQEN		DMA发送请求使能
 *					I2C_CTR1_RXDMAREQEN		DMA接收请求使能
 * @param[in]	 enable_flag	I2C 包错误检验字节使能选择
 *					1	使能DMA发送或接收
 *					0	禁用DMA发送或接收
 * @return	 无
 */
void i2c_dma_enable_ctrl( i2c_dma_request_t request, enable_state_t enable_flag);

/**@brief		I2C 标志状态查询
 *	
 * @param[in]	 flag		I2C 标志选择
 * @return	 返回标志状态
 *				1	已置位
 *				0	未置位
 */ 
bit_status_t i2c_flag_status_get( i2c_flag_t flag);

/**@brief		I2C标志清除
 *	
 * @param[in]	 flag		I2C标志选择
 * @return	 	无
 */ 
void i2c_flag_clear( i2c_flag_clear_t flag);

/**@brief		I2C 中断状态查询
 *	
 * @param[in]	 flag		I2C 标志选择
 * @return	 返回中断状态
 *				1：	已置位
 *				0：	未置位
 */ 
bit_status_t i2c_interrupt_status_get( i2c_flag_t flag);

/**@brief		I2C 中断位清除
 *	
 * @param[in]	 flag		I2C 标志选择
 * @return	 	无
 */ 
void i2c_interrupt_bit_clear(i2c_flag_clear_t flag);



/**@brief		I2C 清除TXDR数据
 *	
 * @return	 	无
 */ 
void i2c_txdr_data_clear(void);

/*@}*/ /* end of group I2C */

#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_I2C_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/

/**
  * @}
  */

/**
  * @}
  */

